home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Topik
/
Topik - Disk 39 - Educational (19xx)(Topik Public Domain)(PD)[a][WB].zip
/
Topik - Disk 39 - Educational (19xx)(Topik Public Domain)(PD)[a][WB].adf
/
WorldMap
/
map.c
< prev
next >
Wrap
C/C++ Source or Header
|
1978-05-25
|
41KB
|
1,881 lines
#define REVISED
/****************************************************************************
CARTOG.PAS Accompanies "Mapping the World in Pascal" by Robert Miller
and Francis Reddy, BYTE, December 1987, page 329
****************************************************************************/
/*
PROGRAM Cartog;
This program plots geographic data from the file
WORLD.DAT and coordinate grids on the Mercator,
Equidistant Cylindrical, Sinusoidal, Hammer, and
Orthographic map projections.
*/
/***************************************************************************
ye olde notice:
This Program (Was,Has Yet,Has,'s,Should Have,Is,,Cares,Believes)
1. TRANSLATED (poorly & quickly) TO MANX AZTEC C AMIGA, USING VICIOUS
CUT & PASTE/SEARCH-REPLACE TACTICS.
2. TO BE SETUP FOR 68020/68881, but won't run without.
3. ORIGINAL PASCAL SOURCE CODE AS worldmap.txt FOR REFERENCE.
4. author/translator DECRIES/DENIES ANY KNOWLEDGE OF PASCAL.
5. ASSIGN MAP: DEV:PATH where the world.dat file is.
6. SETUP FOR ORIGINAL LOW RESOLUTION world.dat FILE. IF YOU HAVE OBTAINED
ONE OF THE HIGHER RESOLUTION VERSIONS, CHANGE DFSIZE TO REFLECT THIS.
7. USES A DEFAULT MAP CENTER = MY ADDRESS.
8. NOT FOR MEMORY RESTRAINTS.
9. IN AN UNLIMITED SUPPLY OF CPU CYCLES.
end of ye olde notice
***************************************************************************/
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/memory.h>
#include <exec/interrupts.h>
#include <exec/ports.h>
#include <exec/libraries.h>
#include <exec/devices.h>
#include <exec/io.h>
#include <libraries/dosextens.h>
#include <graphics/gfxbase.h>
#include <graphics/gfxmacros.h>
#include <intuition/intuition.h>
#include <devices/timer.h>
#include <clib/macros.h>
#include <math.h>
/*#define DEBUG*/
#define XSIZE 639
#define YSIZE 399
#define DFSIZE 45366L /* world.dat size in bytes, */
#define DPOINTS DFSIZE/6 /* 7561 data points */
Enable_Abort = 0;
UBYTE titlemain[] = " \
AMIGA WORLD MAPPER -V0.0- ";
UBYTE anytext[81];
struct IntuiText anyprint = {
1, 2, /* front/back pens */
JAM2, /* draw mode */
0, 0, /* left,top edge */
NULL, /* default font */
anytext, /* text string */
NULL /* next string */
};
struct IntuiText IText1 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -180 ",
NULL
};
struct MenuItem SubItem13 = {
NULL,
45,112,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffefff,
(APTR)&IText1,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText2 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -150 ",
NULL
};
struct MenuItem SubItem12 = {
&SubItem13,
45,102,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffff7ff,
(APTR)&IText2,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText3 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -120 ",
NULL
};
struct MenuItem SubItem11 = {
&SubItem12,
45,92,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffbff,
(APTR)&IText3,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText4 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -90 ",
NULL
};
struct MenuItem SubItem10 = {
&SubItem11,
45,82,
68,10,
CHECKED+CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffdff,
(APTR)&IText4,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText5 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -60 ",
NULL
};
struct MenuItem SubItem9 = {
&SubItem10,
45,72,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffeff,
(APTR)&IText5,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText6 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -30 ",
NULL
};
struct MenuItem SubItem8 = {
&SubItem9,
45,62,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffff7f,
(APTR)&IText6,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText7 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 0 ",
NULL
};
struct MenuItem SubItem7 = {
&SubItem8,
45,52,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffffbf,
(APTR)&IText7,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText8 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 30 ",
NULL
};
struct MenuItem SubItem6 = {
&SubItem7,
45,42,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffffdf,
(APTR)&IText8,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText9 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 60 ",
NULL
};
struct MenuItem SubItem5 = {
&SubItem6,
45,32,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffffef,
(APTR)&IText9,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText10 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 90 ",
NULL
};
struct MenuItem SubItem4 = {
&SubItem5,
45,22,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffff7,
(APTR)&IText10,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText11 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 120 ",
NULL
};
struct MenuItem SubItem3 = {
&SubItem4,
45,12,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffb,
(APTR)&IText11,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText12 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 150 ",
NULL
};
struct MenuItem SubItem2 = {
&SubItem3,
45,2,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffd,
(APTR)&IText12,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText13 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 180 ",
NULL
};
struct MenuItem SubItem1 = {
&SubItem2,
45,-8,
68,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffe,
(APTR)&IText13,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText14 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" LNG ",
NULL
};
struct MenuItem MenuItem2 = {
NULL,
0,11,
60,10,
ITEMTEXT+ITEMENABLED+HIGHCOMP,
0,
(APTR)&IText14,
NULL,
NULL,
&SubItem1,
0xFFFF
};
struct IntuiText IText15 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -90 ",
NULL
};
struct MenuItem SubItem26 = {
NULL,
45,112,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffefff,
(APTR)&IText15,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText16 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -75 ",
NULL
};
struct MenuItem SubItem25 = {
&SubItem26,
45,102,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffff7ff,
(APTR)&IText16,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText17 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -60 ",
NULL
};
struct MenuItem SubItem24 = {
&SubItem25,
45,92,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffbff,
(APTR)&IText17,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText18 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -45 ",
NULL
};
struct MenuItem SubItem23 = {
&SubItem24,
45,82,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffdff,
(APTR)&IText18,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText19 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -30 ",
NULL
};
struct MenuItem SubItem22 = {
&SubItem23,
45,72,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffeff,
(APTR)&IText19,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText20 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" -15 ",
NULL
};
struct MenuItem SubItem21 = {
&SubItem22,
45,62,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffff7f,
(APTR)&IText20,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText21 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 0 ",
NULL
};
struct MenuItem SubItem20 = {
&SubItem21,
45,52,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffffbf,
(APTR)&IText21,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText22 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 15 ",
NULL
};
struct MenuItem SubItem19 = {
&SubItem20,
45,42,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffffdf,
(APTR)&IText22,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText23 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 30 ",
NULL
};
struct MenuItem SubItem18 = {
&SubItem19,
45,32,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffffef,
(APTR)&IText23,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText24 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 45 ",
NULL
};
struct MenuItem SubItem17 = {
&SubItem18,
45,22,
60,10,
CHECKED+CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffff7,
(APTR)&IText24,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText25 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 60 ",
NULL
};
struct MenuItem SubItem16 = {
&SubItem17,
45,12,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffb,
(APTR)&IText25,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText26 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 75 ",
NULL
};
struct MenuItem SubItem15 = {
&SubItem16,
45,2,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffd,
(APTR)&IText26,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText27 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 90 ",
NULL
};
struct MenuItem SubItem14 = {
&SubItem15,
45,-8,
60,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffe,
(APTR)&IText27,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText28 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" LAT ",
NULL
};
struct MenuItem MenuItem1 = {
&MenuItem2,
0,0,
60,10,
ITEMTEXT+ITEMENABLED+HIGHCOMP,
0,
(APTR)&IText28,
NULL,
NULL,
&SubItem14,
0xFFFF
};
struct Menu Menu4 = {
NULL,
279,0,
102,0,
MENUENABLED,
" CENTER ",
&MenuItem1
};
struct IntuiText IText29 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)"ORTHOgraphic",
NULL
};
struct MenuItem MenuItem7 = {
NULL,
0,44,
156,10,
CHECKED+CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
0xffffffef,
(APTR)&IText29,
NULL,
'g',
NULL,
0xFFFF
};
struct IntuiText IText30 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" HAMMER ",
NULL
};
struct MenuItem MenuItem6 = {
&MenuItem7,
0,33,
156,10,
CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
0xfffffff7,
(APTR)&IText30,
NULL,
'h',
NULL,
0xFFFF
};
struct IntuiText IText31 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" SINUS ",
NULL
};
struct MenuItem MenuItem5 = {
&MenuItem6,
0,22,
156,10,
CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
0xfffffffb,
(APTR)&IText31,
NULL,
's',
NULL,
0xFFFF
};
struct IntuiText IText32 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" EquiCyl ",
NULL
};
struct MenuItem MenuItem4 = {
&MenuItem5,
0,11,
156,10,
CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
0xfffffffd,
(APTR)&IText32,
NULL,
'e',
NULL,
0xFFFF
};
struct IntuiText IText33 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)"MERCATOR ",
NULL
};
struct MenuItem MenuItem3 = {
&MenuItem4,
0,0,
156,10,
CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
0xfffffffe,
(APTR)&IText33,
NULL,
'm',
NULL,
0xFFFF
};
struct Menu Menu3 = {
&Menu4,
189,0,
84,0,
MENUENABLED,
" TYPE ",
&MenuItem3
};
struct IntuiText IText34 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 45 ",
NULL
};
struct MenuItem SubItem31 = {
NULL,
117,32,
52,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffffef,
(APTR)&IText34,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText35 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 30 ",
NULL
};
struct MenuItem SubItem30 = {
&SubItem31,
117,22,
52,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffff7,
(APTR)&IText35,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText36 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 15 ",
NULL
};
struct MenuItem SubItem29 = {
&SubItem30,
117,12,
52,10,
CHECKED+CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffb,
(APTR)&IText36,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText37 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 10 ",
NULL
};
struct MenuItem SubItem28 = {
&SubItem29,
117,2,
52,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffd,
(APTR)&IText37,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText38 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 5 ",
NULL
};
struct MenuItem SubItem27 = {
&SubItem28,
117,-8,
52,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffe,
(APTR)&IText38,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText39 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" LNG++ ",
NULL
};
struct MenuItem MenuItem12 = {
NULL,
0,44,
132,10,
ITEMTEXT+ITEMENABLED+HIGHCOMP,
0,
(APTR)&IText39,
NULL,
NULL,
&SubItem27,
0xFFFF
};
struct IntuiText IText40 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 45 ",
NULL
};
struct MenuItem SubItem36 = {
NULL,
117,32,
52,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xffffffef,
(APTR)&IText40,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText41 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 30 ",
NULL
};
struct MenuItem SubItem35 = {
&SubItem36,
117,22,
52,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffff7,
(APTR)&IText41,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText42 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 15 ",
NULL
};
struct MenuItem SubItem34 = {
&SubItem35,
117,12,
52,10,
CHECKED+CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffb,
(APTR)&IText42,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText43 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 10 ",
NULL
};
struct MenuItem SubItem33 = {
&SubItem34,
117,2,
52,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffd,
(APTR)&IText43,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText44 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" 5 ",
NULL
};
struct MenuItem SubItem32 = {
&SubItem33,
117,-8,
52,10,
CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
0xfffffffe,
(APTR)&IText44,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText45 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" LAT++ ",
NULL
};
struct MenuItem MenuItem11 = {
&MenuItem12,
0,33,
132,10,
ITEMTEXT+ITEMENABLED+HIGHCOMP,
0,
(APTR)&IText45,
NULL,
NULL,
&SubItem32,
0xFFFF
};
struct IntuiText IText46 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" FULL ",
NULL
};
struct MenuItem MenuItem10 = {
&MenuItem11,
0,22,
132,10,
CHECKED+CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
0xfffffffb,
(APTR)&IText46,
NULL,
'f',
NULL,
0xFFFF
};
struct IntuiText IText47 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)"outline",
NULL
};
struct MenuItem MenuItem9 = {
&MenuItem10,
0,11,
132,10,
CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
0xfffffffd,
(APTR)&IText47,
NULL,
'l',
NULL,
0xFFFF
};
struct IntuiText IText48 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" OFF ",
NULL
};
struct MenuItem MenuItem8 = {
&MenuItem9,
0,0,
132,10,
CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
0xfffffffe,
(APTR)&IText48,
NULL,
'o',
NULL,
0xFFFF
};
struct Menu Menu2 = {
&Menu3,
99,0,
84,0,
MENUENABLED,
" GRID ",
&MenuItem8
};
struct IntuiText IText49 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" About..",
NULL
};
struct MenuItem MenuItem14 = {
NULL,
0,11,
116,10,
ITEMTEXT+ITEMENABLED+HIGHCOMP,
0,
(APTR)&IText49,
NULL,
NULL,
NULL,
0xFFFF
};
struct IntuiText IText50 = {
3,1,COMPLEMENT,
20,1,
NULL,
(UBYTE *)" DRAW ",
NULL
};
struct MenuItem MenuItem13 = {
&MenuItem14,
0,0,
116,10,
ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
0,
(APTR)&IText50,
NULL,
'd',
NULL,
0xFFFF
};
struct Menu Menu1 = {
&Menu2,
0,0,
93,0,
MENUENABLED,
" MAIN ",
&MenuItem13
};
#define MenuList Menu1
/* end of PowerWindows source generation */
struct NewScreen scrdef = {
0, 0, XSIZE+1, YSIZE+1,
2, /* 4 colors */
2, 3, /* detail/block pens */
/* Auto screen format */
((XSIZE>320) ? HIRES : 0) | ((YSIZE>200) ? LACE : 0),
CUSTOMSCREEN,
NULL, NULL, NULL, NULL /* no special font, gadg, title, or bitmap */
};
struct NewWindow windef={0,4,639,395,3,2,MOUSEBUTTONS+MENUPICK+CLOSEWINDOW,
WINDOWCLOSE | WINDOWDEPTH | ACTIVATE,
NULL,NULL,titlemain,NULL,NULL,0,0,0,0,CUSTOMSCREEN};
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Screen *scr, *OpenScreen();
struct Window *fbwin,*OpenWindow();
struct IntuiMessage *message, *GetMsg();
struct RastPort *rp;
struct ViewPort *vp;
struct FileLock *alock,*Lock();
struct FileHandle *filehand,*Open();
char coordname[] = "map:world.dat";
long openflag = 0;
long mclass, mcode, mx, my, alrsmem;
APTR maddress;
struct Window *mwin;
/*
struct dfrec {
char code[2];
short longitude;
short latitude;
};
*/
#ifdef REVISED
double Sqrt2 = 1.4142135623731;
double PI = 3.1415926535898;
double HalfPI = 1.5707963267949;
double TwoPI = 6.2831853071796;
double Radian = 1.7453292519943E-2;
double RadianDiv100 = 1.7453292519943E-4; /* PI/180/100, needed to convert */
/* data in WORLD.DAT to radians */
#else
double Sqrt2;
double PI;
double HalfPI;
double TwoPI;
double Radian;
double RadianDiv100;
#endif
double pink,mpink,sinphi1,cosphi1,r2;
double L, L1, PHI1, Lambda0;
double ASPECT = 1.14; /* aspect ratio */
double R; /* map radius set by draw */
short *buff,*malloc();
short XCENTER = 320; /* AMIGA Graphics constants. */
short YCENTER = 207; /* Screen center X and Y */
short NotVisible = -32767; /* Flag for point visibility */
short LatitudeSpacing;
short LongitudeSpacing;
short pclng,pclat;
short LastX, LastY, XP, YP; /* Save variables for plotting */
short I, J, K, MapType, M, X1,Y1,X2, Y2, SX, SY;
unsigned char LastPtVis, GRID;
main ()
{
short areabuf[100];
struct TmpRas tmpras,*InitTmpRas ();
struct AreaInfo areainfo;
extern struct FileLock *alock,*Lock();
extern struct FileHandle *filehand,*Open();
extern struct RastPort *rp;
register short *dp;
register unsigned long i, j, k;
extern long mclass, mcode, mx, my, alrsmem;
extern APTR maddress;
extern struct IntuiMessage *message;
if (!(buff = malloc(DFSIZE))) {
printf("\nNO MEMORY, never mind.\n");
exit(99);
}
printf("Checking world.dat integrity...\n");
if (!(alock = Lock(&coordname,ACCESS_READ))) {
printf("NO LOCK on %s\n",coordname);
exit(99);
}
else {
if (!(filehand = Open(&coordname,MODE_OLDFILE))) {
printf("NO OPEN on %s, error = %d\n",coordname,IoErr());
UnLock(alock);
exit(99);
}
else {
if ((Read(filehand,buff,DFSIZE)) != DFSIZE) {
printf("BAD READ LENGTH or whatever on %s\n",coordname);
Close(filehand);
UnLock(alock);
exit(99);
}
else {
Close(filehand);
UnLock(alock);
}
}
}
/* check rec code integrity & convert back-asswards IBM, 6502 type format */
for (dp = buff, i = 0; dp < buff + DPOINTS*3; dp+=3, i++) {
if ((*dp != 'LS') && (*dp != 'S ')) {
printf("\nBad Code in world.dat -- data point # %d\n",i);
exit(99);
}
*(dp+1) = (((*(dp+1)) << 8) & 0xff00) | (((*(dp+1)) >> 8) & 0xff);
*(dp+2) = (((*(dp+2)) << 8) & 0xff00) | (((*(dp+2)) >> 8) & 0xff);
}
/**************************************************************************/
setupfpc();
openthings ();
vp = &scr->ViewPort;
rp = fbwin->RPort;
rp -> Mask = 0xff;
InitArea (&areainfo,areabuf,40);
rp->AreaInfo = &areainfo;
alrsmem = AllocRaster (100,50);
rp->TmpRas = InitTmpRas (&tmpras,alrsmem,RASSIZE(100,50));
SetDrMd (rp, JAM1);
SetAPen(rp,3);
GRID = 2;
PHI1 = 45 * Radian; /* 45 */
Lambda0 = -90 * Radian; /* -90 */
pclat = 45;
pclng = -90;
LatitudeSpacing = 15; /* 15 */
LongitudeSpacing = 15; /* 15 */
MapType = 5; /* 5 */
SetMenuStrip(fbwin,&Menu1);
drawmap();
FOREVER {
Wait (1 << fbwin->UserPort->mp_SigBit);
while (message = GetMsg (fbwin->UserPort)) {
mclass = message->Class;
mcode = message->Code;
maddress = message->IAddress;
mx = message->MouseX;
my = message->MouseY;
mwin = message->IDCMPWindow;
ReplyMsg (message);
if (mclass == CLOSEWINDOW) {
FreeRaster (alrsmem,100,50);
closethings ();
exit (0);
}
if (mclass == MENUPICK && mcode != MENUNULL) procmenu ();
}
}
}
setupfpc()
{
#ifdef P68020
#asm
fmove.w #2,fp0
fsqrt.x fp0
fmove.d fp0,_Sqrt2
fmovecr.x #0,fp0 ;move PI to fp0
fmove.d fp0,_PI
fscale.w #1,fp0 ;2 * pi
fmove.d fp0,_TwoPI
fscale.w #-2,fp0 ;pi / 2
fmove.d fp0,_HalfPI
fmovecr.x #0,fp0 ;faster than scale
fdiv.w #180,fp0
fmove.d fp0,_Radian
fdiv.w #100,fp0
fmove.d fp0,_RadianDiv100
fmovecr.x #0,fp1
fadd.x fp1,fp0
fmove.d fp0,_pink
fneg.x fp0
fmove.d fp0,_mpink
fsincos.d _PHI1,fp1:fp0
fmove.d fp0,_sinphi1
fmove.d fp1,_cosphi1
fmove.d _R,fp0
fscale.w #1,fp0
fmove.d fp0,_r2
#endasm
#else
pink=PI+RadianDiv100;
mpink=-pink;
sinphi1=sin(PHI1);
cosphi1=cos(PHI1);
r2=R*2;
#endif
}
procmenu()
{
extern long mclass, mcode, mx, my;
extern APTR maddress;
register short i, j;
register long menunum, itemnum, subnum;
menunum = MENUNUM(mcode);
itemnum = ITEMNUM(mcode);
subnum = SUBNUM(mcode);
switch (menunum) {
case 0 : /* MAIN */
switch (itemnum) {
case 0 : /* DRAW */
ClearMenuStrip(fbwin);
drawmap();
SetMenuStrip(fbwin,&Menu1);
break;
case 1 : /* ABOUT */
break;
default :
break;
}
break;
case 1 : /* GRID */
switch (itemnum) {
case 0 :
case 1 :
case 2 :
GRID = itemnum;
break;
case 3:
switch (subnum) {
case 0:
case 1:
case 2:
LatitudeSpacing = (subnum + 1) * 5;
break;
case 3:
case 4:
LatitudeSpacing = (subnum - 1) * 15;
break;
}
break;
case 4:
switch (subnum) {
case 0:
case 1:
case 2:
LongitudeSpacing = (subnum + 1) * 5;
break;
case 3:
case 4:
LongitudeSpacing = (subnum - 1) * 15;
break;
}
break;
default :
break;
}
break;
case 2 : /* TYPE */
MapType = itemnum + 1;
break;
case 3 : /* CENTER */
if (itemnum) {
pclng = 180 - (subnum * 30);
Lambda0 = pclng * Radian;
}
else {
pclat = 90 - (subnum * 15);
PHI1 = pclat * Radian;
}
break;
}
}
openthings ()
{
extern long openflag;
char *OpenLibrary();
if (!(IntuitionBase = (struct IntuitionBase *)
OpenLibrary ("intuition.library", 1L))) {
printf ("Intuition open failure.\n");
exit (FALSE);
}
openflag |= 0x01;
if (!(GfxBase = (struct GfxBase *)
OpenLibrary ("graphics.library", 1L))) {
printf ("Graphics library open failure.\n");
closethings ();
exit (FALSE);
}
openflag |= 0x02;
if (!(scr = OpenScreen (&scrdef))) {
printf ("Screen open failure.\n");
closethings ();
exit (FALSE);
}
openflag |= 0x10;
windef.Screen = scr;
if (!(fbwin = OpenWindow (&windef))) {
printf ("Window open failure.\n");
closethings ();
exit (FALSE);
}
openflag |= 0x20;
}
closethings ()
{
if (openflag & 0x20) CloseWindow (fbwin);
if (openflag & 0x10) CloseScreen (scr);
if (openflag & 0x02) CloseLibrary (GfxBase);
if (openflag & 0x01) CloseLibrary (IntuitionBase);
}
clrscreen ()
{
extern struct RastPort *rp;
SetAPen (rp,0L);
RectFill (rp,2,10,637,392);
}
drawmap()
{
register double LONGR,LATR,X,Y;
register int XP,YP,LastX,LastY;
register short *pp;
double MaxLat = 80 * Radian; /* 80 degrees. for Mercator */
double lam0 = Lambda0;
double K;
double CosC, CosL, SinPhi, CosPhi; /* Orthographic */
switch (MapType) {
case 1:
R=70;
break;
case 2:
R=85;
break;
case 3:
R=85;
break;
case 4:
R=95;
break;
case 5:
R=90;
break;
}
setupfpc();
clrscreen();
if (GRID == 2) drawgrid(0);
else if (GRID == 1) drawgrid(1);
SetAPen(rp,3);
X = Y = 0; /* printf hangs if try to print NAN */
for (pp = buff; pp < buff + DPOINTS*3; pp+=3) {
if (*pp == 'LS') LastPtVis = FALSE;
LONGR = (*(pp+1) * RadianDiv100) - lam0;
LATR = *(pp+2) * RadianDiv100;
if (LONGR < mpink) LONGR += TwoPI;
else if (LONGR > pink) LONGR -= TwoPI;
switch (MapType) {
case 1: /* MERCATOR */
if (fabs(LATR) < MaxLat) {
X = R * LONGR;
#ifdef REVISED
Y = R * atan(sin(LATR));
#else
Y = R * atanh(sin(LATR));
#endif
}
else X = NotVisible;
break;
case 2: /* EQUICYL */
X = R * LONGR * cosphi1;
Y = R * LATR;
break;
case 3: /* SINUSOIDAL */
X = R * cos(LATR) * LONGR ;
Y = R * LATR;
break;
case 4: /* HAMMER */
LONGR *= .5;
/* K = R * Sqrt2 / sqrt(1.0 + cos(LATR) * cos(LONGR));*/
/* Compiler generates incorrect code for this statement: namely a
jsr mulu# (integer multiply) for the product cos(LATR) * cos(LONGR) */
K = R * Sqrt2 / sqrt(1.0 + (double)cos(LATR) * cos(LONGR));
X = 2 * K * cos(LATR) * (sin(LONGR));
Y = K * sin(LATR);
break;
case 5: /* ORTHOGRAPHIC */
CosPhi = cos(LATR);
SinPhi = sin(LATR);
CosL = cos(LONGR)*CosPhi;
CosC = sinphi1 * SinPhi + cosphi1 * CosL;
if (CosC >= 0) {
X = r2 * CosPhi * sin(LONGR);
Y = r2 * (cosphi1 * SinPhi - sinphi1 * CosL);
}
else X = NotVisible;
break;
}
if (message=GetMsg(fbwin->UserPort)) {
ReplyMsg(message);
return();
}
if (X > -300) {
XP=(short)(X*ASPECT)+XCENTER;
if ((ABS(LastX-XP)) > 100) LastPtVis=FALSE;
YP= YCENTER-((short)(Y));
if (LastPtVis) {
Move(rp,LastX,LastY);
Draw(rp,XP,YP);
}
LastPtVis=TRUE;
LastX=XP;
LastY=YP;
}
else LastPtVis=FALSE;
}
}
drawgrid(outline)
USHORT outline;
{
register double LONGR,LATR,X,Y;
register int XP,YP,LastX,LastY;
static short ol=1;
short Longitude, Latitude, LatLimit, MaxLat, LongIncr, LatIncr;
double LL, PP, A, RA, XN, YN, SINDT, COSDT;
double K;
double CosC, CosL, SinPhi, CosPhi; /* Orthographic */
double lam0 = Lambda0,LONGR2;
if (!outline) drawgrid(ol);
SetAPen(rp,2);
switch(MapType) {
case 1:
MaxLat=80;
LongIncr=360;
LatIncr=160;
sprintf(anytext," < MERCATOR > MAP CENTER: Long. = %4d Lat. = %3d* ",\
pclng,pclat);
break;
case 2:
MaxLat=90;
LongIncr=360;
LatIncr=180;
sprintf(anytext," < EQUIDISTANT CLYINDRICAL > MAP CENTER: Long. = %4d Lat. = %3d ",\
pclng,pclat);
break;
case 3:
MaxLat=90;
LongIncr=360;
LatIncr=5;
sprintf(anytext," < SINUSOIDAL > MAP CENTER: Long. = %4d Lat. = %3d* ",\
pclng,pclat);
break;
case 4:
MaxLat=90;
LongIncr=5;
LatIncr=5;
sprintf(anytext," < HAMMER > MAP CENTER: Long. = %4d Lat. = %3d* ",\
pclng,pclat);
break;
case 5:
MaxLat=90;
LongIncr=5;
LatIncr=5;
sprintf(anytext," < ORTHOGRAPHIC > MAP CENTER: Long. = %4d Lat. = %3d ",\
pclng,pclat);
break;
}
lam0=0; PP=PHI1;
if (outline) {
if (MapType == 5) PP=0;
PrintIText(rp,&anyprint,(640 -((strlen(anytext)) << 3)) >> 1,12);
LatLimit = MaxLat; /* Draw only extreme latitudes */
/* to make map outline */
}
else {
LatLimit = (MaxLat/LatitudeSpacing)*LatitudeSpacing;
}
Latitude = LatLimit;
while (Latitude >= -LatLimit) { /* Draw parallels */
LATR = Latitude*Radian;
LastPtVis = FALSE;
Longitude = -180;
while (Longitude <= 180) {
LONGR = Longitude * Radian;
LONGR -= lam0;
if (LONGR < mpink) LONGR += TwoPI;
else if (LONGR > pink) LONGR -= TwoPI;
switch (MapType) {
case 1: /* MERCATOR */
if (fabs(LATR) < MaxLat) {
X = R * LONGR;
#ifdef REVISED
Y = R * atan(sin(LATR));
#else
Y = R * atanh(sin(LATR));
#endif
}
else X = NotVisible;
break;
case 2: /* EQUICYL */
X = R * LONGR * cosphi1;
Y = R * LATR;
break;
case 3: /* SINUSOIDAL */
X = R * cos(LATR) * LONGR ;
Y = R * LATR;
break;
case 4: /* HAMMER */
LONGR *= .5;
K = R * Sqrt2 / sqrt(1.0 + (double)cos(LATR) * cos(LONGR));
X = 2 * K * cos(LATR) * (sin(LONGR));
Y = K * sin(LATR);
break;
case 5: /* ORTHOGRAPHIC */
/* R2=R+R;
CosPhi1 = cos(PP);
SinPhi1 = sin(PP);*/
/* There was no need to compute these every data point so I didn't. */
CosPhi = cos(LATR);
SinPhi = sin(LATR);
CosL = cos(LONGR)*CosPhi;
CosC = sinphi1 * SinPhi + cosphi1 * CosL;
if (CosC >= 0) {
X = r2 * CosPhi * sin(LONGR);
Y = r2 * (cosphi1 * SinPhi - sinphi1 * CosL);
}
else X = NotVisible;
break;
}/*switch*/
if (X > -300) {
XP=(short)(X*ASPECT)+XCENTER;
YP= YCENTER-((short)(Y));
if (LastPtVis) {
Move(rp,LastX,LastY);
Draw(rp,XP,YP);
}
LastPtVis=TRUE;
LastX=XP;
LastY=YP;
}
else LastPtVis=FALSE;
Longitude += LongIncr;
} /* while long */
if (outline) Latitude -= (2*MaxLat);
else Latitude -= LatitudeSpacing;
} /* while lat */
if (outline) lam0 = 0;
else lam0 = Lambda0;
Longitude = -180; /* Draw meridians */
while (Longitude <= 180) {
LONGR2 = Longitude * Radian;
LastPtVis = FALSE;
Latitude = MaxLat;
while (Latitude >= -MaxLat) {
LATR = Latitude * Radian;
LONGR = LONGR2 - lam0;
if (LONGR < mpink) LONGR += TwoPI;
else if (LONGR > pink) LONGR -= TwoPI;
switch (MapType) {
case 1: /* MERCATOR */
if (fabs(LATR) < MaxLat) {
X = R * LONGR;
#ifdef REVISED
Y = R * atan(sin(LATR));
#else
Y = R * atanh(sin(LATR));
#endif
}
else X = NotVisible;
break;
case 2: /* EQUICYL */
X = R * LONGR * cosphi1;
Y = R * LATR;
break;
case 3: /* SINUSOIDAL */
X = R * cos(LATR) * LONGR ;
Y = R * LATR;
break;
case 4: /* HAMMER */
LONGR *= 0.5;
K = R * Sqrt2 / sqrt(1.0 + (double)cos(LATR) * cos(LONGR));
X = 2 * K * cos(LATR) * sin(LONGR);
Y = K * sin(LATR);
break;
case 5: /* ORTHOGRAPHIC */
CosPhi = cos(LATR);
SinPhi = sin(LATR);
CosL = cos(LONGR)*CosPhi;
CosC = sinphi1 * SinPhi + cosphi1 * CosL;
if (CosC >= 0) {
X = r2 * CosPhi * sin(LONGR);
Y = r2 * (cosphi1 * SinPhi - sinphi1 * CosL);
}
else X = NotVisible;
break;
}/*switch*/
if (X > -300) {
XP = (short)(X*ASPECT)+XCENTER;
YP = YCENTER-((short)(Y));
if (LastPtVis) {
Move(rp,LastX,LastY);
Draw(rp,XP,YP);
}
LastPtVis=TRUE;
LastX=XP;
LastY=YP;
}
else LastPtVis=FALSE;
Latitude -= LatIncr;
}/*while*/
if (outline) Longitude += 360;
else Longitude += LongitudeSpacing;
}/*while*/
if ((outline) && (MapType==5)) {
/* A=0; /* Draw circular outline
RA = r2 * ASPECT;
SINDT= 0.05996400648;
COSDT= 0.99820053993;
X=1; Y=0;
XP= XCENTER + (short)RA;
YP= YCENTER;
LastX=XP;
LastY=YP;
while (A <= TwoPI) { /* Compute points on the circle
XN= X * COSDT - Y * SINDT;
YN= X * SINDT + Y * COSDT;
X= XN; Y= YN;
XP= XCENTER + (short)(X*RA);
YP= YCENTER + (short)(Y*r2);
Move(rp,LastX,LastY);
Draw(rp,XP,YP);
LastX=XP;
LastY=YP;
A+=0.06;
}
*/
DrawEllipse(rp,XCENTER,YCENTER,(int)(r2*ASPECT),(int)(r2));
}
}
/* The damn floating point routine is faster than DrawElipse() !! */